package cn.south.campus.admin.campus.service.impl;

import cn.south.campus.admin.campus.mapper.PartTimeJobMapper;
import cn.south.campus.admin.campus.model.entity.PartTimeJob;
import cn.south.campus.admin.campus.model.enums.PartTimeJobEnums;
import cn.south.campus.admin.campus.model.req.PartTimeJobReq;
import cn.south.campus.admin.campus.model.vo.PartTimeJobVo;
import cn.south.campus.admin.campus.service.PartTimeJobService;
import cn.south.campus.common.model.enums.CommonEnums;
import cn.south.campus.common.utils.AssertUtils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.PageDTO;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.time.LocalDateTime;

/**
 * <p>
 * 校园兼职表 服务实现类
 * </p>
 *
 * @author chow
 * @since 2025-03-27
 */
@Service
@AllArgsConstructor
public class PartTimeJobServiceImpl extends ServiceImpl<PartTimeJobMapper, PartTimeJob> implements PartTimeJobService {

    private final PartTimeJobMapper partTimeJobMapper;

    @Override
    public IPage<PartTimeJobVo> pageQuery(PartTimeJobReq req) {
        LambdaQueryWrapper<PartTimeJob> wrapper = new LambdaQueryWrapper<PartTimeJob>()
                .eq(StringUtils.hasText(req.getContact()), PartTimeJob::getContact, req.getContact())
                .and(StringUtils.hasText(req.getKeyword()), i -> i.like(PartTimeJob::getTitle, req.getKeyword()))
                .or(StringUtils.hasText(req.getKeyword()), i -> i.like(PartTimeJob::getContent, req.getKeyword()));
        PageDTO<PartTimeJob> timeJobPageDTO = partTimeJobMapper.selectPage(req.getPageDto(), wrapper);
        return timeJobPageDTO.convert(PartTimeJobVo::convert);
    }

    @Override
    public PartTimeJobVo queryById(Long id) {
        PartTimeJob partTimeJob = partTimeJobMapper.selectById(id);
        return PartTimeJobVo.convert(partTimeJob);
    }

    @Override
    public void publish(PartTimeJobVo partTimeJobVo) {
        PartTimeJob timeJob = PartTimeJobVo.convert(partTimeJobVo);
        timeJob.setStatus(PartTimeJobEnums.PartTimeJobStatus.PUBLISHED.getCode());
        timeJob.setPublishTime(LocalDateTime.now());
        partTimeJobMapper.insert(timeJob);
    }

    @Override
    public void cancel(Long id) {
        PartTimeJob partTimeJob = partTimeJobMapper.selectById(id);
        AssertUtils.isNotNull(partTimeJob, CommonEnums.DATA_HAS_NOT_ERROR);
        partTimeJob.setStatus(PartTimeJobEnums.PartTimeJobStatus.CANCELED.getCode());
        partTimeJobMapper.updateById(partTimeJob);
    }

    @Override
    public void modify(PartTimeJobVo partTimeJobVo) {
        PartTimeJob partTimeJob = partTimeJobMapper.selectById(partTimeJobVo.getId());
        partTimeJob.setContent(partTimeJobVo.getContent());
        partTimeJob.setTitle(partTimeJobVo.getTitle());
        partTimeJob.setContact(partTimeJobVo.getContact());
        partTimeJob.setWorkTime(partTimeJobVo.getWorkTime());
        partTimeJob.setSalary(partTimeJobVo.getSalary());
        partTimeJob.setCount(partTimeJobVo.getCount());
        partTimeJob.setWorkAddress(partTimeJobVo.getWorkAddress());
        partTimeJobMapper.updateById(partTimeJob);
    }
}
